<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/%E8%BF%AA.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/%E8%BF%AA.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css">
  <link rel="stylesheet" href="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"zhengyidi.github.io","root":"/","scheme":"Pisces","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":true,"show_result":"flat","style":null},"back2top":{"enable":true,"sidebar":true,"scrollpercent":true},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":true,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.xml"};
  </script>

  <meta name="description" content="设计模式 - 行为型 - 观察者模式">
<meta property="og:type" content="article">
<meta property="og:title" content="19.观察者模式">
<meta property="og:url" content="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/19.%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/index.html">
<meta property="og:site_name" content="Zhengyidi&#96;s 学习记录">
<meta property="og:description" content="设计模式 - 行为型 - 观察者模式">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2021-07-12T00:00:00.000Z">
<meta property="article:modified_time" content="2021-11-13T14:58:22.510Z">
<meta property="article:author" content="zhengyidi">
<meta property="article:tag" content="设计模式">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/19.%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-CN'
  };
</script>

  <title>19.观察者模式 | Zhengyidi`s 学习记录</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

<link rel="alternate" href="/atom.xml" title="Zhengyidi`s 学习记录" type="application/atom+xml">
</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">Zhengyidi`s 学习记录</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
      <p class="site-subtitle" itemprop="description">休对故人思故国，且将新火试新茶。诗酒趁年华。</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-fw fa-home"></i>首页</a>

  </li>
        <li class="menu-item menu-item-tags">

    <a href="/tags/" rel="section"><i class="fa fa-fw fa-tags"></i>标签</a>

  </li>
        <li class="menu-item menu-item-categories">

    <a href="/categories/" rel="section"><i class="fa fa-fw fa-th"></i>分类</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i>归档</a>

  </li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup">
        <div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div id="search-result">
  <div id="no-result">
    <i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
  </div>
</div>

    </div>
  </div>

</div>
    </header>

    


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/19.%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="zhengyidi">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Zhengyidi`s 学习记录">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          19.观察者模式
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>

              <time title="创建时间：2021-07-12 00:00:00" itemprop="dateCreated datePublished" datetime="2021-07-12T00:00:00+00:00">2021-07-12</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                <span class="post-meta-item-text">更新于</span>
                <time title="修改时间：2021-11-13 14:58:22" itemprop="dateModified" datetime="2021-11-13T14:58:22+00:00">2021-11-13</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" itemprop="url" rel="index"><span itemprop="name">设计模式</span></a>
                </span>
            </span>

          
            <div class="post-description">设计模式 - 行为型 - 观察者模式</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
  <script id="hbeData" type="hbeData" data-hmacdigest="3463a636265802ac738438cc94a436c2b72bc2c887265db04ca9a7ea7abc8c96">22064b17c03cb0c0e58c99349b6889d0b31470871e725085fde7c8feed9af7ef9ec6382cc049002e84530617b6784363d89b2e2bf724b4dc61b78e054073a078bd853acae330393f46cf6c5eb62aeb6a35e821cb24059da898a3aa64f5a0df9d85edb998c419cd9b83daf2b3b1c0b6b659ddcb9d10f711286d90b3809d5f9d2ed1225dc9c7650de9bc0cda90350d690533965c71b4ba2d944e35ccf3f530d3dd0a2d1a4e1085550db54f61e29f3c088250399d6c0914aa9911f6537b48af40649c2b6de8f603d7c6a8c75532b87c4fac090af892f0fa58455216d6fcb8aa271477e68209775f6b96ab815803a1cb5629f1d5f20ff9837044852564e401ecd7a9c47f3df3642864d75f18b5b62c5053d7266190362f15e0fa37361bcd39f8067e305acf662e271d01e5b73f1dcbb07bc629b45db17d1317621442d5214eed5df8bbc84263649baa1006c485c746d557fadfcdb90b1022365a428eac994d503c5c3e141ad7ced58c672e726e23a201aa836af07ce29fd47133d0ba6e23b27a982da09174a3542bc64a624a3e5f7f3100260f5487dd95769a55f9e36a5e9d5c9daedab9558d86ae9543c2fa10850082cf64a01d6dbf55c49e876c624e04db01b6625d6068fa0687415910d17d6ecc03c7705d493c1c557ac71f420f06860125b1b4a22fd5f410b77e658d9b21fd976170ab642f7193638271055a2f41592fc2ded5c6f6c2115747328da09ef9a21c15ac0628207be0bcc0e4fbbd2391ecd78c0e768b13156134f89b59745dd4b946802dc32dbe319b3a8e959d02133bcbdc07898317d10ca320751537f4fdfb98d7c10c6cb4da0f8e7fe3b54342b05b414b8f86be24a0a8df24589c7e92b68a95b3abf2a8514f830fb8cb8b862f40968089fc9de3fcf2f4fa365de62980daf5a9caaf24c148e28e1da504b697751b50587cdc9474ab306c93bf21e488e0629014832c9c7054ba5d3d55b61f148c1e8e24cc4dfbfb9d56e7707a5676e83c21085bd55f6771c8c7cf6ead4abba570f39c3060a991dd3b4e61a92d60b0fb09f5a99a6ee097571a6a9d136c95383120d5cb002ddc4e438778af1d9bc33e6ac9555f148265b7bd3317031ddd8c435b7a8c2c824aa9826da47a840143a4a580d684cf9b2a34a151a48df2a44f974fbdb4d0807d1709e8f0d2765f3df63af2de3057bd6d03f392c0474426a1060ee47ba015055707161b3f7f84d627845adcab53f744669dc25e77cc17a5f2015ec32c2f8a5849634ae2f865e2b846ea43009cef472cfcdcf8a8756c62b2414e9a035696a2425222de7c1c0c09b8713a330ae0a8ea3c75800991f388b02e3af8f7d8a98f1b1d3c7ee9f9797b5f731451e39996d788656393bd14f4ac23a3eed035759470216c58ab1d4baee5828fbd3a95b7e718aeb2c8bd4f0488d237044cc82e19a19c65b4a037c0989ad26ad018082b30fc996c6d38295e4898cef361771a44b3f3ef8f3216db56f585b45d3d1a98468ca0442e53fecde638e8ffde552f96ba913caa808757fb6c9f7e186ce6f8fe4a47bb98d1f7dbeea06c62366422746c6400b36bc6481841a2fac2df3d7ae60e042e388278b02962e718ef0bf0dd2921c1d4c7374cd99f7cda090d5aa8e4e9068df795effbceb52ca3a6013c0b51ca39bdaad127836b3addb2b6be31238819bfb020acbde07d1cdb4a477106fb32073e2840f21d6b840dcf3f0bdfbc105ad181f1a767bf8987ea17b25ac739ae0762056692bb02f8f1671d7ac4cd010969116f5ed7632900e47e7274d54dfac98decd467766a5b27a26f1f93642c10d87cef0fe23b62e90959932b20c5e02969d53ac0e9fcb7784f6286a2e3c0d84768ac38701f1df97952d4a119ebf2976f095dbefbf4ea11cf58b3b089d8029518cf2893d8800eb9f6be047412239264797dad26de81eae477268bd35a948cfb4512bbeb7d7fefa4684e56a15d63ec2e166c1a907d922bdf42ed8a0c2bbdec7c1a881704327f622332e8ccf1678911861ffc604f1875ade67505623292e9e9488a0e22e9ab3a0ba82babbb725f04086c65c45d41d8908283be46dd7afc7e87a702472525f1140ed50c76a818aec661d8932cff1927ab0382df789e4c0516e96db691836bf8f1802445a42c69baf79fc8e19a19c5457fbd603eaa34e4782fa6794457e15a6711e0a7fce17fff196e2c60d72c4e567675555078a76d004328972f544e7bcb85d18e04fe7930d1f51327b56f110739feaae53adaf348ad86c1705260596c959d34a1fc26831e464653a746dd208a9b07711abf6798dc3e552bfac3761eab500f7b173ed059d3b79ab4207871c6d80a87244925fc634fee3b900faf8557c04397536bff241bf106943f601aaa190e2f8482d570213870b69c3182af46415005e44e9ec2b705e2cec0953b2094efa79012f677922b483500f6f66feb8ac42d8763721f4ab11b5b1a1cb5d07a1bbcd849f393a2a6f453ecbf4d8b6b965c8f0a34cb6ae5a9cd17e041c4c70da68615fdc66dfdd5f8aabb9935d6f897fbf355eb41c7c963a813572bf10c8429dc2d6b372fbbea89f1a423643f4f2f0c0c61b4cdacf8ab0e6ad31759352c18ce8dcd92501aa60628e72ea23d502a7fd7a711fd1f3dc2a4d7b62f073c525d4cc3d72fb6d4277cd42446372d785d7e56c3d1600b3d17364964918b4b44371dc3ceb36ef52b052b85de932327eae8ffad3240f5a8a0a07af5ff29bc5e071be13d8293343ff8110792bb23244f14599abbdffa8a8f46d3c02c9037b70a1b849e16aeda92a95ef791f031e45ccde956c1366db063c5ced15c1d392452baf2647f7e134dbbbd5d586c2f3d031f7e50070772385623130f50ec27f4294afe95c4042fa691b12d404cb858e2f65604e528ff2d591742be298c96038f1228f0a0166bbc6d376ead982748b0f20b3f2a6908c7208c1467cf075131c6b2aed880584af3e394e2fef08ebabb52eb4145c6093f0a95613e5839cebb6f240a4cfa7d07eeea43ed1824f4e16242a4d39fde1e2e26ee7b6df282c767bb858314061e835854808e69bed25bb837967162a6350d5b745e9b95040b071e4953964bf4beba313370ba8287747d5527c9d092f757fc3bcac5d344bb2e70feddc39bcdca2c31e44bc80a7e66e49702e269ae24bd1796c676fac9d49ec0f0eea8a48e132f67bf7b315811bbe8b676738971ffbc9dc80fe96e3efa319be95f34406f7eb4540f3d253cb478e93fb74752011843a21cd2c88731914ce1f168704e8dc790440fb62e40f5e85e57bee1a9e1f171039e8db9fba851dcaf212fcd7ee4698730c74199c5a737252921cf93da8384631c9931801beaaeb2c49880f5768c274440e110591a06a8936f108d8b21ad4dfc529251c9982fce85884c708b9db0d3c1c47c0f6d29a626659ca7d61742e1e3b57e363bf17c9a031ec6846655def3930991eddb931ca7f05b50140b15ce935eb653d524ed5d54a033f3b80ca3cd55450663547ce8949a4f936567c846462ba8808d0c297ff390125fcbc3244700de68d11fcd870dfd2587a649412cc613fd2a16ed3a055ce7795bccb6971a680ba8c1203a76ba48ddd0ed950320e55ae908a1e5c761e52a6efb4a5ef6d56c250dada30e64f11f6322f5bde27e168903d07cf73ccdc2cce568e4863c654da248776173e876ce718bcbe52858abd1fe6a035266b2aa712bcfd650d6086ab2bbecb1e5993272743c2e86141a2b547b3ddb9e4ee794dbb1d9f57c66ef26ae5c4bddad593baf64aa582cb0512805e9a99cc0fb193ed58038b8ab85acde4d6ba46d5a4247bda6e735a0f412c6b872fc3791cdc192d3f1881d7e38b28b4f6041bd7749523bf020e0f08af4c6f4a6c8dbc206e8d2d498951aaaf86b7608a04bea76791b47a7e7781425a76dc9833df8a39fbfbdea12bf5a9aa36bb5b7248d2d7d3533f8a296f5545a06b3b3551622022232b10d63a69957342301a084dbb98595be0ba4065ecaa0c7322012b1e94a3ec2942c75c81f8dc6d327f54ea1e1ecfe7f565dc326f6e3b25d37c6be70ffc356f1fd37bac36b5ba35d406613229a20bb2401d9f6c3266afab7b68e3f82c1a590b7e9ef145c11f2ff9e75f32f24fc91e28fde4a26dfd86d4262629850ea1cbeecf4785e8c8961b1d156c5d816c5b489f86da49b46e932b0560c4fd14baea23feec0875a0f78123d56a2896432f9072b69f900b73b48922ed7c62493083940855823002806a5e09f3cdd70e2b6b18616da117ab2ad830755a6a0db1624cb0cc62b245abb59090ae4945c21a14da7a0e7f41c39fac36ffbba0b2f99b94f33743fdf64138f05b676e07ea01e1f32e22f783a4a85a8700dcfabfce34fbe8fdbf189b773601f29aa9ad750702899603773aac5d0cb9dfd1e2db661344c73e3ce4f1146333d67ed7b05bd833d22fc924de67fd61b0bf9e823689477f4cb5f610ec76a0d0439703d118bdcf17005bcf3219739d69a787f7e239ef72a54d7f6a3643770a9fd169e41e31172f86bc870a31eed5fe905dbbb07e9c2a93faeca6d3c1f0a908e4b908baafd99543eecdbf1728cec17017b0a99f53561e98d37135834d6c70ed3863e11411e838e76a07a5fa85cf18bb05f9293c502fbdbeb0dca4b464cad0a772c41bfc548dbac8a6f07170001dfae4beaca714952a75e051151f69cd689b469632518f5b83af8aedd9eba0af2c94dc4851a32204417f7de30b21d99dd2019f678d0e916f6d77b57c9e97fb64521b865f000ed0db4d28e658fa2e766ed90eff025087eded9d9f3e080eb3e85e771ac090605dfd854ab36c8dcd3498b100faf1c6cb895940c3ec12e889e73155cb08b5ecd44d89f83428791f033f1f60bc5291d2c7b67ea848fa3cd0932a0977a3770e67cf9cc00b8473f578014a58b8408981ccabd73b11f9ea230e559015b93e69cb566350f01f0aed9c7c7992f4fbf7c99a8dd47e3ca4e8984898be65fa1359a732255b7c4892e3e55a24dde46be924e3c4a9c5cded5ee318c55e13fb0ea15b922c32a8b87bb5db1ef61eb2edd9e344646fad70455cdcb95a8ed61b64f9e5fb1d7e954fd6845dbda91b9df5d165e9c9631966f45327125b96a5fb70166636bf113407941db04cf6d9356388211da7f40541ed8b0df7e87035ffa804b6ec5db196f521873ee2ae1a8aa5bcfcc2e7baae22ea073450fcc2001c4141239abcc67103c05aa56b1e05d4bd882f1a19e4965ce0035410c6c6f968caf211f570dc452f2f77a9f002ce84e168450f351d50d87f7932f2a566bc8260101bf31ac2e9c78096b673638382b89b0a2b8d2710ea5405effaf87720dc259e69dfc09be9fc39ada44d504d0eb4c232ab18772aeebc17845367ea83a2b16296ffa628d3f2e8944768a65466ca081bed20383d09f79c92282e900ed24191c163a596a4a2a73282c481b2c26b43aa366fe45c570624ec11623b58929d57b0a3cce68d26b114d7b6a3084ada4a8dde6fe34f0717bee8f0f1157d2de1ebdbca950a19b7d09d8efacef76183fe0c9c89a212d010f67016964bd1570f8d38e62ab3af03c3161c67d35559b039711d33320f6cbd0c0d880a30b9c723b48011787e555cd832ba45d6042f3eb2d5d70ec52abe93206010c14730280ae27febc1465c4824964870edd69de77e5e998ed4b7d8b8c7d71ee11857e425258dd23a796ee3d9715723afb54eb9fc9f2c4b69241c4281a982f1660e2005883860d7c77850347473e7c046b54e68a362660ad72877f4502ea0651d13b93c02d0206af3e6044bbd4a5e6f35767684b1202dbaeaaafa7ca128029e65e212c5c2556a9573a83247a68474ade37b5c1577b8bb441a094a473303ab657bf4444abfaf752789b6dea61c077b46e891278bed52117eec6ce1320383ac6a7e63515730ec9efe7ac71c433928b10e3a7044140edee26284628b0188218a5bb7c7b8a81a954448b3474bbd7209cd826a6a3bf4c82f0f48b1c7925b5eed8a878d1df6fb6933effcea39574f3dd23229fb96eb4b0777f5266c5782c05e2047b3fd80218cb255547d11bd6972f5f2cc7446f9d77e3ba5df0b576b0ad9cfe13b8914df08950956a403739f47d5b69a13977dd237c6db52e39526b926f86a10f3a988814baa4201f3d18a1c8ace0a5727ad9342da31990d918ec04711424c147124b2b43629a4472a51f9d30de72257102bbfc834ea45aa3dcec0b6078fcdb51b2259f221b5f5bbc9380ee25c9bc6bbdebd402f2fa37ddf42ecbd687bb4ee5a1fe6ee7eef8dab087ea9f144e126e7e7b98c6f610f02979ad9fdd7fcabeca8d5cd5e2f9072c5219aee8c23af08ea6cab7f08b5a613a74708cf06d8e28f167ef9a47e2e38d640e610124664defa930e828ac0d4662da784a4f51c86e45da822261540a40a0d8d698557d55094a79d21ce9c122a599d31c0c0f896bc855fed34b610ad600bb9ef2f4d23e9f029b64384da4c6500a730085b502dd7b7470560c6af66d708464475bb5320fbf133f3f80d2520ff911fdfd93227618ddbf185c7a44d5b2c7ab9bce193c97435f539577f06d53dda671546aa08a6a0bc29ec86dcb26397f73b07c2fde1370069e3f5ca27b5440a024cda57a5ba91402829123666a8c0f4d3d592d42b529b50392925a3ae02222ed0fed40b33251af9e0b73233fd59c27e9012b4a54a26cb7f7c80a5fe0c93cf0da4954ecba4ead711c788cadb37a4b3787c338ff70bdf4e7c61017818e8ed7ef351a706eda9aab357011778d7bcf7bf58958fbe8ff5648b17dd7d778bb6f361b986c18d8a29b6fe9de681fb4f8e5cde9b2ee7256510fb0704bab0adf79de88aa89dd5927c3228c2b049af5e8bd1155b2e356151a3ca57a16bd9d1c3efd01e5e5ebac7c9c9ad4ca279b6a6e3a7834f70e32d918b9a4cdf3b512eae98c63e1f73dccbcbdcce5b5ee27113291d2085423652afba8269b9d3fbef81c182ca0fbc370fefe1b5188dfc8b526ae0568e327d3e42950a10f122ccc966713fdd9bba1a2b711813c19ba64ff2cdb89f3ac5b7b303d218aff4b36af15eeedeeafb630e042b08a7869937da1c44c095716722df62d4f03d294c519746a918bfa19eb9f4cf286ec3c4096edb72bb0603d7b1cc00db98cd17a8451ebdfb38b5e8bd53c9ec4dc1dbb191425e298dba6edeccef66784aaba360f3782f9321f412fa4b4ec05f4c01e2fb5fcae8288ec7ab87acd390f5e1c59a02a926fe1de687d23bf679e38cb4c395fa659832a3f3ca008139d7b0d08e717a1e1a993c90ce1df6f5dcacc0e6cbb0b087144682f7c2e111303e364e7992dfa8350362baff50fa66bf0f21d4b4a6208a7cda1771dad10e247da07db14a378076e908577c71c94c38ebb9ef6262b5667462564c450fe02a3adab6d96ed67b295f1160b6b589e82a5b87dcdb4e5b05c48adacbbd38ef9372b670aea555af985f7056c7e9e1729b1c713f7860abd9fe7b7e397d3a26624144371c5d0cb26ed326313012436996bb3bf1369e08a75a4b21c5f0a04dfa57be8d06ee909a1b0d1911c1a2eba2028ab223ff2c8f6c5525c99e7901febb059cb6c213054f8b4a2e1ce2acf49a225bf7979e519078ad4211459da957ce1ec4ae979671099905219a65b1f6f59adf46ddaa5bb1005b09551d3f35463f001aa9e41adb4173c71ccdfa0ce87070fbac579084d8e6b1b97f8b93cbf1975d69a7a38a6be917f16b32230b4a369cda5d8f5dcde29ca5c82d8ca477435542f32cdcef0c0413a832963a837683821ead3c636e8d94fb8f2f003997039875963da1dbc34e49f6c1220f8753a58cd99fde0643f0bb40ec7fdd421e2799d92e3e07ab670478db4130b698bb191f3856570c4026069f4a2df3b5758a8abfef153f131984adc1bd18b7596ca29904a2bcb25a39ec75f4ddfda20c3b89580b11aa08c4185c0c9f70368d0b3ac9eb970076c1f5ad6798df5e1c84bda7e1b29e8e06061e166fe820fb6b91456e4f3141479d202671e91f57b729af9fbb22e0daad7d5a398d46c3d6dad5e0bac968aab4683b3d3da8a70019ef5a449d449f5ce876652f1a79ed7f7b0fd25d05452fd47de6d708b697bfad9b352603dc9588b7d169f0cacee658c33eed7e0b1528dafcc9223b3959fdda0231d6cfa203fa47029c1f6a130bceb94f6a983fd3f3f892efa607dd9e942c1ec08c52f14fecc555538ebc687ea01d120fe478ecc1e0ddb21957fff2f004726d9931174399312dc6b66f80c90dfbcd9b53ebe2e9c6cbfa6370d48fad895c16e87db56999b9640b2b06f422484006056e420c1cea9256505579e65c319cd40bd6104dc4d3a839c9228ac3fe1aa56a60d27e9ca75a00f9702b3c55ad876dba085274244ad0a4610dc84812e461904d9f89930bbd1f9ad280155dcfc23071946abcea552aa518850f28823ed29bd965d70dd89a5dd72350d654d6038af2b8fac65e2f3882e26e2b06d3db152800bef07d24a1e63ba468337a83c3c57ec10ef5156fdb90df796c4aa69fbc9b75710b6080e042e72c9eefa83eae5c8c583da612884e9b74fe8db59f38091951f48d6625cb285c0c18d1b920e061d65512e22c3a87b2fb42bd1b525e4fb6be570506ff9f1fc35021a3bccf8eb4d597b053c7d28a228fbba4a74f8b7aeaeabcfd2238449fc6b77e8b1aa3f29c947f504d1124a311e2d14b0ade1a7395afe381fa13f772bb46de1af70bb3a8e6a857850f018954ab751eafc04d39fd88316e9edeb5bc80751f9cf7c130adde0657419bf08d207c8e896b2a62f1e26a39acd2838ee902cb85379147f5380f41cc9f40ba5f750dc73f2d5cc188af8fcb9a71f1abe480673835963bf567683ca02c9ae418ca3abfedd3faaa997135bc5decac31e40e6597ac3e01e65508ec719abc0d1c74573a1022003a5edd7b74bdc4930a3f4b3fc3ca951f3b7e42503545e16474c44075435a7c03e568febbe4e09c6dd436af3e9d4a41facfb5226c460c13c5c6c17ef228fd4cdf9c91a595fcdad4852eba20c247e5d04d0580bc5708c0033c1e3e69d6f94ac8abdb54e11fbf29afafb3d4ac3cdb4a69fd4f921c5facbf3a005b7cf2111a705ae7434ec2409166e3c484c74f019fe3e31ff02b4ba530273c5740636e482dfea93047dd68036bda2334443d43fbdd4a15c81cd8e16915a6aa405d75152aea09fa97d2ee3c75a496fdf43ee89490ea1c850d62d9f047973c796ae83ed90abf090de1fe484cd234b45f6bcb06977fb9dd81cc740d81f69ded9266a60b2be7a5599ffffd56303be46507bb6497d7043b2e7c3ad2eec70c8c66ea9e757b481a583d4ca12dbccb3b50037412c15baf95a29d5c08c258534fc5666f3441a2be26d67e4876f1ba4660dbe30a6919049329e35dcc048face1937f1cf55d10005ca875d5989a8c91444b56249bce0f4a972782944976a5bd1c6f8169eeb428b340c5c416360119227e4b48823d15f18845a1eaeafe75edf6d2d30fa4bdc470cb915e97cd0561482f8061f55e917a2185eb4f5ab3989453c4ed2ba38ec103771ec655f859021d7780a349ea1f62d7fa1c4ec9931a62a65c9671151e2823d3dfa07175b3ba8abc2afc6002b17d3548f5c8c2d7d96e3cfc9c3c557b5f7652860ffa9de606595f7243afcec98f9459d1a0036cdd0999a09df6eebbda565ad2023ba5b6574a3cc5fc794846c86d0e84441743a756e0ef75d0a68ea572ebe422cdb5505c1d20ddfcf9f0568ee4daa3153f0ec262f0918322f8ffc05cade391e078d824e9f47590c90db4360fd1bf971eb22d173a413f7678909fea27a602c07e6c73b8f6cd9b884e927f84dee2ea6ee0efa13dd605268fd4982882c3ca7f804f4974344b24534015ded098e0a88191af7d592e9142759b60a599d4d4e7557531ad147b0e3eeb348df1ca55f0bf759701399b9b72fb3288633ed57af69bc3e2fab439cef7b2c6de63aac4568eeeace28a89797117fc47a77d0f5a82606bd9311e8dc8808662df1697d8a69525a42fd0f9cfb8548f96c6be7e33065afbc36922194901ce57d7af050d2afdd3130c2c3f2c9fb8f49ccd16b3be6e2d7fd73141721974e746ecb2459399cd0ad3dc2287c172be7978a58ff1977e96b9e8eec1e8deae167612cb744f7120398a5d8ac76f4ac74e663af5273c6bdd75d7f83794230df02132a0609b126753918d3c628e7af9533740282d13dbc371ea8e0720bb769b5f2df762fd90192f3aff294c4352531d2dd2f310e61246eb3749cf888aeeef4fcdb3ebb17fcdcd971c68094c339e7567bb6bda2253e83c57c741c2a594e98713e2a7b16d195ebbb1f646b445265d15ab83ddbdeefa8b5db331bd3877115e13bcf5a21a50d2563129363c6ef151d72434af6c9d866e67874de8aa650d943ce37cef034e6e85d989d1c2c3b059e73e5b121b6b5c0f8ebe3b60eb00305fa91c7eaf66f26605365d76b74777546c474635d6956c4273397e4b817d457a3886816a15a357e5e916f1c51ffff153023fee6dfd38af83a661e406d1d0733fd3c20510c60055bcf75a1c662a96deab3b935ffc68b236af82796dd799c8b9ba145ffe913ae432bc1e2d617d1f6d4d07d65bb01089296829c82be0717e0dcf8634939190b27cec5e67999e66d8d33748c6b2c704f339ff0b8257168095714de8c18d0d33f729b0274a83142920f7791412beadffaf051ab51a9159a560fc37da2faa1b7d043eef2cf8073f78b07cef40586c68ae30fdfc4799721c0afe5a4e24c6ce734920b5ac34311f17431f6d5be7f7a937daf6f4b70560ae22b9c0e06208f2414aa8e2f429339b989b4a7d2ca8adb9cb211661322cc11e96f492f4add39e81f69259b04aa6081fa9e4d2b081b5c0c2c68741e23c0d4dc34c437c998d8200cb6f12047707c70ab99bc7b54da3976ebcf42c4ccb68c41bc75bbb0fa3d82e757945c12ab9e99390dffb9500287093de4028473aedbff421215a63f9d0ab5972745daaef1ae19d840400047773735e428fcfba261bd9c3b563f27bec450513da0ba770b72ddef283db513271eb05f235fae4917fe1239b52564c944035be84e4f7226348816d2b9d97d27165b623c6acbb1eea7d2a6e5f7895d0cba0ffe62080b70dce066b490e585fcb197c6b547bef82eac0fef60ec6ebf985ceb0df8244f4caa9f30d768da87e67db5b4c673c0fac7ba9052ec758ffb25dad3b08ddc44cc6abc3ba68faf0aa1f0b9be75a41f21effa90f01ee6cd28503a8a0aaa8a922d28249ea045c4b5b0be6da8605586f99a4695d0e7d16612d38fb874e15ab8235c98debfdbeae9f81eef76509db0d898c405130c12709503887b5982bc2d3c4c4f8c5330928ce3f0eb4d53ad274c51e790317a52801b41afc44a385474bada76a387b09e505b6786d2b504c6b4da634751c484bb4a95833a7789fd352dcfd5b7385bad6d7863875d4fb34dd8a3efaa056891e81741506267d053535a4188011ff34894c53596fd67c9dbb95b74a7295c87e516862454be4948e3079e4e087ad2f0590747ea6c3658b63e14772b0e90c7fa5d8373bc8b70a4c365968e07605b1bf89d2c9901c84c72d3e353f2c1a261b09a10f69f88b1847c1540e418b321300af516185210157a003316c51b9f12086a3adb51dcae518da1db1c6dfe89b8f5d754c81b9c46011d942d50fa6cfaf3a8ba22b90fe9a31611a5b167a5f7c76893c18aec94085241748bba0a099db03b919887f3f453de7e55559f1e2afcf807d9deefa7b99e17ac1119c3c5e7610f77f6d1a878af164e76ddcae37917b1209aa4a25562aafd1d551fe3d599360b9373d33b4c200321ae6414a76214cd5813050ec30dbb19c1d1d1fd1254f06ff2b0f651678910af03bb4fdb96a36f9ac602abc120d143c1d067375d26f87c3e39d4370e5a5bac0812ccd5e0b593c1fc8a5653d3d4e94d39646a096a3496586870765e73bc7a8930d9d0d39dbdc13df333719c53616d7f5bea4e2058ec541818d407c48232c1a755a8952d5b9655e3cd78526d11bdbf446fbb561ea0ab50e54872cae67ad93b52449b7f86bfe26c861d2a2d09c31d1ea2d73cb605aa0dfc745517d0e7f2864715edd141c1773db9b1a107c8a1cf1113d9093e7a9137303fabdfda952463fc70e9e7dd02cca23552b20b048f9e1c9018036cb328674e5d9071fc0675456d07a841b97f463aaebeac8bc4cae9af71bfd46e7695cec969c8d5e014c528cb7c64d8e33a8e6b6d26389114c928770943487b79bca47ce02184dbf7dd87e66a82c276f50d3f4f9f1c97f96ea37a7afa42a07276f2cd173b084650003b7f67b501056b606aecba6bd258ab783cd3e0b1e796adeb7eb97fe3ae66bcf03deba8847659ceafe640641fd4235a053b4e882315c5ab9793e463eb0fbd39a5bae0dc52bd87ba56eae5652cb42c9ae248a2f2d68ea22db8f723493fb8235e726bee838a15736e7bbbe92e1e24043dc06344c90e80c4a330dfcf2a7a3e535f67fbf4ecaf717bb3740b0e6f7952acc015ea2b7e96225b20241a44841850d93d74b643fd0015d2cea65d0197c3236602f4052c89b6a5d34d6816a92239505b5fbe9886cef2f8bc8330b202ac56c2fb35b228efe9213b9aabac57b8c53a2e2ef3693df1729c393b4615295d3dc07b66a2c7fccea99baa4a21914bdd5b704f736a6413d2a1475954dcea6b25d02215dfb0828ee3f2540873c7272968000076997116d378d5c3813c98573b329a895b695c4d2b4d8b98a84904bde18e01b9f2c39302cad3739993012ec1abc7fce3a77dd7bd4bc3e16893d98aaef65109d7b0f123675c4be48011b215d79bd010697bb83641c9da7c3f723b97abf8407afe3eba4c755123cb16d2d46faa12f02c5fb9371adfe6ac0b894e1df1222560f34231672ade05834571835f40a462afd334239e9da76f1c4fa1b5abd4f695a3a93c4f90e41e50d9e24b3ed3714cf3e5cf521f812ae73cc51ff5dccde92c1e99d1e683005388ce55137613fcdfbb60be404c0c688d767484dcec298549797852f883c40920f13df56db9dc2c2463ab3079485c73f4df3bc5a3075a42a38730baa78ac1913b80feeb4939650d79aec0e38f5a97a494fbea34c119bd3d669bf632b4ac758b0ea85bed4a0963e9a0186e83299c44c3bd543d69042482e4fe624c70923bb933c2411676ec81647616a569a926326edc8e1c99911f7e2f20334d534eca9684ac50717b82d8cfeb1d02b5ff58a2d9b7a8d43ad24da1fa1c30ff8afabe91aa4b2fae32ab3db3b51304eb27fcb86c6aa1ff938915eb7dfcc231f948ea696b94ba7b8ba8f73247f142ed82c30774895935242a24fff4ffbfcee57ebbd7862b7cbe6bae8fa7230805dd5c67e9644bf3600802ab7a3cd0281353a03c67754b9d56771546f2c91b6b1781bd4243cd90e24a6b9e09353e0a97bf1379b5b6627cb10d05e829a06cb6f8ca94dbf2879b5851059a2b53a54879ecae73ac09eef6583e735f8c8a3c7253128d4a927572f825ea9ac5d566bd49d09253aa9036519781fac5bf9b5bc8b1c4cfa7a2f2d1c2a82f58ed9d023fa05fdf0a7005dbe95fd0759c150e8b6f2067599d2a3b040497ee39b0baa809b2cada3502d7ca8027ede907200396ec81bc05d40d03464e13ec1a53e1d3c4a7cdf8b2c622d00028ed536563b576d5c15f777a1314ebc880f13d4f17756cca7b502483a3eb9341ee5d0ded11dfeaf5e5c5dd228241760e40416c1f0732411fc7aeaa2b6b98c6b5abac488543e6cb75e0de98f2cd34542ffe83b3481af6e57e1c0f85ad36ff695adc71d847c83cfd4982a0692a5806de860d28c72ec262603e840d499bf709bfc0ecd2a6f8fb544dd47b016fefe50597ebd43b6673c7195c797cc86c8b6e5851d21f23a8ffc475fd6763a19370761acd0c587750e1fab95e01cc30728682d7c3b720f696ffa908adb6a758dea2a4e4aa8dd66e7b88836066e3342f0b40ba41ea7a62b75e5be138ec1859d3b28f7facdd16adcd70ca37588a766d0e11ec68b61aa9632b7a50a9f9218f5be03a69bb1c43200f0f23e1b2d70897d031c74c80abe0acccc4ec3fca3ec36be8363500e54d8f7e4aa72c670a75778befcda0add44448953cd7c845b26fc5fd8e011a8d4fc6b373f525f6f0e0060006b5b33abede177f2a476b580e70cc1f876eb707c4e5afc07fbc5eb06a3fdb8f01e55e250ac483e559db9d4031556e071d753fd2c6d3e2413b96317396aedcdfa7a76b29dd549c11d4835810fd80b7783dc71bd36a5e1b92dcd2afa6448228a569dc87647f541d3f422bfc3984cd638fe2eaa80d36333451ac7e3e83325ca330f02a8dde6ec339ba1ee9804c2967a58aaabbe81a080d2b02de55993adbe9b4542cc5177db894d27aa36b6382284928b896b8ed81cefc38e466130a90f1e9eeff9e39fb68df46e45ad7c22237fd67cd9cb0625bcea8da222a736ba660c899bfddef8e6cee4bbdb636f8cd01d8e76b5b95a07f24c9c225564b0d1a4f752ef85bf8958f59e7ab5f50e3d438617642013cd9f6ea43ae44ab8290f8881a83138b9e94c4e1155f8c703648af2d0a8338025e59e252105b468087acfbb01b9d9e64f7de0e9ae3fdf02eb657b4eec535e53db358130b55389e2c00b8c74b965a92eef65d97d26abbad3c2c4ac212a508955c6379ba6c17985ccb0047c0c65e480fd9433a490adf2cb5f6e9f66250b6412b4374ef5e6ac65cde6ca1d002e8f8fea77edcc7c35a2842a3450bdc9de79cc5fb242f1a023369a5c8f9ef43180133e3524507ec9df33f41517e525f746d6cfa434adfe0aef9175a99cf2b566c16499125ed594a4d0b19be682db9318db18aac0fdf6bc5da028ccc6c43dcedc1a55248c312b8ef22faf094e29dd42666c104dfd19db4fab1f16d6cc6179b206a98bb8860e516079d48de0391d9f68e889fbaa3773d96f940ca465cb02a881d52d8e0ac70c534db7ef0694c945a7cdbce92b150d6ba05ffa129f6733e665e08385e07a3b07e64e5f6d29f2f6b147ab83c257a9c23df101614a8afa84aa527039a8fd16630af77ae2338aad17c9511177b4e2a2cc75c4ac27bf8df48a6f1da41b15aff7d975d0884f4db43ca3ff57349a60477093dd5df5b87521cf197034df73c0487108fd355e3939a54f580cdb130147a889221fb3dcab2ac0c330ef57e2b1540ecd5c3d8a4d603b68c4790b656aea759a34507805ce0c50bfc1e014128623d22db3bc1561254465c4588d145bc34918671d6c2e5b4118dec597a56e7d98c05adb8e914b8255f459149499327f267a2451606c51ddfe1b89bb10334dcb8e340d072ea734b989c662f19766a3fad72d4194ceb04cf47a0e15164c753c6b0556ef2bb3e83eec6f2d0d60a3b60a0fbd992f65d33595a059896fea64f1fe93407b643fa3aa5b98e62d64442264c48db4722559fcc25dc6f2c10cb75d52471638906c8811dbe16c91f503b98dda0b130c5b261b2bb3b7b510a3efe42f173cb6a4b2fd2770a098d46dedb917c3f8756abce3afc40c3fcc270c1a17fb8a60583854684ddc7e34d63dfa255b2803416f50d94d325dfe4e82d8b7e9c7025dc0849cc5933e5f4a00efdc80d25ccbc4b7a3e76866543c8f2b8092fc7a348efc6132bf52ed241059d81883f4f64d0a99fe8c79428b020bde30a3ce0d382a15cbcad6ade9297ef3e779c6795a692e6b77b0a8ad5c27c68465b2c98e985901294524b1a18520ef274574981c1a923637028340a096bcd82e13a123547db80b86805efb56b81110ebafb388612bb4289905317bc873bebeb5e0d5a57f6a2aa58c5ef45c8fe9d444d57de351fd24f9ed985021780e707f998d937bd1619a3443be60c39e0d9a02b67438856bfc9a3f8c7be4b2362fb6e2b2d62abfee5cf1f1c78c6a14ec65077bacb55b1a9344d032b8385830bcc7febabe6effe402ed5dae815557fd88d14d765cf1b464dad8724b1c1786c6f399b9508b11ab4012824c361aaef43dd1d650bbfd0288cd050f15dbd81212aaf12615830d77639af37ab4c146ff98e380aff302c97da38854bf592aa66ebdfcc762fafc6057fd6d748ded247b3552b4ca414c58a395aa707b6115f73b6b09bd42667573d598451ffefb46a46e0d051f4061a6544e72f8c675a0f618eb9cc0e943984e1040bca040f2a6368086ffcfb8e85b1658a2679fe9548db128b84d2c8752de3920f282618a14a9304c1da70a7d092856c921b9923db855ad47bd541c5af151f4844809dce2f4534b25252295fb8a8fb40e809e8c7f711627f510ebeedf66da6bc9cd7a82a45475f40f14b399c6fbf8a7ebf369e8b95889642dd3fa6b8d2d6ff1462de5d327b3f59747e22c924908d93d64df3f3e576db67ecb12c60422cf90e0174668b321f1a0b398901272d6fcf7814800297596ede8b0114b91236998034d975fad07832665497887b76c270c15e1405e959ddcb9f4e1d3026b9d72a500747f4fb6b7501801f8552e6206963dc9dbdbf63eb9eec60bfb3372b15fb294987d914ad11045e94f4efff6c6ac801c51fbe0beb13ad23445ff5c8f8a7fb0b5553cb9d01d3f74a3ef4f40506a7e5255dfd1f7dba765ae86fcef0c48a332d89222241baa6b089750fb96a11542f8ba57e22d19c483912b12d9c228f7f24d6f5d50152f0530c3b7aa48265b6c51e9361c0363ab5075bd7761eebef55425eb62cd15aaabaeb6ca35cbe1e26599b496de835c26ebcae823e66554a3db9216e9d714e2e395d6b13caf812f9d8b1220675c3d716c22dfee4270d74f974ebc7bc18aeb6c05366a3b9bbf2534c0fe74664048e081e26cccb045f677f287b1b3f4de4ff9984dec8294babd5a4c45cf2d81d1166b0d605753d08af25c20f0502ec3ecdd7b1d34fcb70f36b252ca149163027c76a8c7e2a6bb5505b804b39533c3bce7591a30e44f1dcd3019bb44055fb5889d138cdf4f59a6c71149bcd5cfba86f02fdc56993c8c2020b5254bcf85af3e907d61ff599851fb7f59322cbcdb046fa2d6fc2de405b6b87674073feedbbfdedc1a434357e74f47041e5c73c9fd28a0de2c9b3221bb065371caf58289d929f4a85cb4267d98fe11307e2329f337fba36225a937a3faa4b122e0682daa07e7f33c9d5f313b6e324a6e90321e0b2cf0bdb27fec3d7a93cea73d13668b764b4816c1f73db8d9a701cf80c04e760fc981b5ec142857d0456a383b946f66f9f2b1ea7f304e98b9cb7a8b1e43fcb6727dad6311df18b5ecf333c2964c78d40f0ac5ea26ad3ac55763bb41d2296056f3e07ba3ca593883916102447acee2ee7917740d2aa1203694854b3745f24f23da82934e195bb87306deeace0cbeb11b5cc1fc38e1731b97dd46ffe7b4de3b4dcc17ffeb0d8ec698aa5df281f63314773bc8d0d0ab5856b9903dfc0672ad44f26aa84ee2e97263e9ffb3d66b3bf63c3708e9bd6fe14aee189b7082db0c6292da2e19f9380223724bbf744f1a37d5d5dd2faff89439252669743bf6b4fd70527ebcf7970746d6cf979ba6e2e31f665bd4570273d4ab7db22e45b3fb40692a3a726aae26f13bfd0c2b5a78a06557f098fca3eeeb28cb8ac84781bab0867052d9ceebbac0b2a1342254523396f4bc139b05443ec37c1646331bfcd24d0ce1d7b84752e786ab7d8be2236ce69eb34d868c74327ffbe71648d994d7fd3bfc36bb1cd035eb30ee8f408237de9056f17c901644f7b04e9b9fc5f79b05f37dc492e3b3f7dbdb27b27ac197103946e3c0f9d6907beebb4d707c6fc9af90fa0e1f1c3075cbabf011e459fee5e0946a10dd8ee16cf0e10b50fed8ea47b068eed45fab0c4daf9936004ca0477fc1c56db397edd5ab166322aec189ad9d0890f650bb7ee91488ed4e5209056a274d35968e89c884413efd00c67870d5d461e91e5349237f9c92277b51a395b52d71d122be175d802442ac77c9e512517a0b9f2754f8e2792c311ac6f218dac509207f2e3ceb0aeb9d2bd61af4c93c29553bca45885c493e526f99da28c1383583e9d2ee46b103cf0c0ac837485cd485f9d1e50fb8f8c374f751bf51bedb2ff961fef06814a770a8ea7e6fc96e2da658699719987c8d3172cc32d6f06c0bd69d8b560b3be91beb71ef427d05a5ed87f1af80d009fab8c612412aed1850989525405f41bed88e08edec1d64087207e090a3f13cceaa23b4e2082eb31f9a2c0ab1c08a1b7c382acda9d46508c06b8c71381aff4ed6aa14d7b45d95e264dcf9cb147282192b184905f1714100e0c40813fcafea6cb43a14f0ee7b5dc8461ed081a548aa884b8c448e332fa1b13b5bec4e2da548643124150e954c3ed9fba3d254491916c78e9175e774f7c6ddbf82141f1157217f7fce0a7e1629890091e4d0c0ab880ec88552910e44273e4abc16fac073042bfb310887757a558f62d16e4e80ef3899ab3b0b350955e238c4bdc5532ca87221b2aabfd36443809320abd692b4255c8792d2b12cfb07b4283480e3316ead902eb1bad3099aec7ec627b5f70f33829b7cecf6429ce14cafc31c42e646cc3bf46dad14e71b141c75822f38d86ff0314a70ffb5395fffa687e5315874779956854803f62fb736144c87cb98fe5881205dbcf1a1df56260182294942936001fed27ee509feb78071b98337f4e003ac8283151077984271bb614f3caeb75142cc0a10272dfeaf19df29e09e08be20b4df9d34b1b6036fcbcc4a5777912736076a9f062531b9eb3da1ac32ba2569181cf1d5330b3f66b5c711b76e35c0ddbdc02efb908d642d76a0b2356c4acdccbe75e8478ffb8278d540909d25c1c375234b00f996b67b217ae78c9dbe81446c3a83ac063c5a21e389cf1eac211ae9618878185c5d9371d0dfbf40b445b28c5e33e0501bdc9da781f26f75a42180c97636726ca05f7823f2abd5c707580c8851624d57f932b3583f074a221bcb0c8965dc821b29192a917685ae9c28448c019bcd7daa596beea27dc6b22555cfe5f7204836bcfa708c703b9f427b5fc70db5cb5e4b71923fbbb5cbd77aaa71d260e4b44648bac600474711e3226d0e0ba842c053a3a0d2611701b2b613775826336ae781dadea6e398a789df6fbe168767dcd444b1aae5611c5c4b291f1dfe646b424b7c813265462340fd345260eca9908ffb3797622d0fb22e77102832dfd9bdc599a6de8633d5a2d60d2fef3813a1b8c110047cbcea642b6125cdbf46ef1b431c7a49562af507482a096a52127472544652912f215f0db629419962facc6d3f81c36a61c8843b92e5ac83d0ab1aefd05dc39f37d56cdb2a95246b416c276b101f122713d5883af0a7b3d2e62c95b6b554ed6170b1103b1c437e6a4d55f6064fa43b2d18db41fbdf48da60049c3b5a643dade1887493c47fe6774723dad693b13b73ff46b8eb07f03569c15160cf6bf8b08e9771b00af38f52a6086e1f4b77042cd0f4e353615111de9d231c20909c45d51b7d25f4d336aa451f1147bfe0bc9b7152ad52603b380d1bfba4871844a95dbba5c982209336d4b3e3a25332afd56a2832155617dfb1ea1f2a98bbc58cab9991629c3419c79451a80d6b8c3ea1a0a0bcbec68077c4f82225fde384e81d959bb591f52dd8f303086f9d78472d15b7255aa724ada5b791d983e9a99ad0c8fdbe9465a81e65ee727fcf5d883804d116d710e3301fc49b6df3c543c9bca27aa10b9f908209e3277619c3491d43f13d189f43e0fc636b67e6a892a926abadb1132c05488fb22909cbe4daff00837fdea8338eb0df8dd1b4fb854989e0275ce9270d54278b5397c57632ba38a863e81224aac10a1de06341af9720b29508d8deeb21e0e746a5f549330dc5fc7a36f242e4854db12dc8578d5b993e9ca175592eca2640b04581f615c177ed19819583ff1622dd0821448e44ef2aaa07746f7c7439195183fe17c65c4ed98757f890a81f42658a55a63f124dde9bbda5b3d52561f9f072c7072c009b1a7266c5e7c988d55e371c84bb00aa9b76dee9cda37a9e416d2031276980dbbb6699e760be411af9d15b9d572756c81dc6b0ee71e3b08e874ef357e12c19b08ba6a076dca11854c060615167b359f9bf092342cb7c584015846cf4c3fe5b2474cc82a53af5f2024a54d2c0423efc872aba76ece2c46cc37a7cedd8ae6234035c164d0669a69f1c83f3d5557344472e54ee8be0df47cb001a63c550c41358c534f806587d9da2152e7af9c30af955122ca9455800f70d387188618fc9dd5845b050a5e9c5c3018caba5771363fe03ce64ecc694a09bf3faae115770300f7482c054dd082700d9c0b21243aa5026025110c92e72f142c425cd9e6c5ae5fbeae96ffae8b870ea4e9ed98504364f324f350727e9ce838b22431e8d24fc98f68d3deda7649a391777a8bc565a931ca3af2fe50561ca38f9b7d0e47d1cba489cc1e80a69945093b8d255448b530899c1443aac2eb0d8ba1c57cabbea2441f0a4d54f442cd3c684f212f95ff2732255d89754b6e77a7470551d1501845d2b356204a7a95aa8e19bafd9021e90975ff7f1f2c9c6b7960609a9f5fca95c097b321acbdc48edd783f2824999e45610fc77d447b4aaad12fa692d2dfa7193dfad47fbc6d871f2258c58b649a0a30b0d87f67dc7fa0ce413c2a9a04cdec47e9a34cf47d0c8ab3371abbb841044f4245e1bb1c96dbf84616dd27feb38af3cbcee2635b36da6073da2fc38b2d6111cbe730843751b4fba17b1b507b12e690032ffbfedf462f47468aca9df9b8c2ad4c2b55fcf571db07e98eb9f8ae9be16a44f4a25968ec2615fd591771e83142897cd5c5f30c204845d3b090daff56aabfa93728b9de341643817736c1afe1cfd72b7fb9b0e2e4bc1731fc7742721f744a98010dd26788318def55fed34c1047c02c89cebd66375f335593482517f9ee2748c25dec151d8d21a4dd39733dc2dcf6314b9ef949db6d5c4f4b55ff1a6afd2b9caf06c9ba0242d943ce2e4ffa00fb25d28a42c12c47c5e947ce39a196a723df57b8a2bb86851f764b7300fabf5c58df9cb179fe9e3dcb0d7fb0979fe50d02e3577993578e44f80fdf7ca152c64688064360fad1c2a11f80de4e12c88553bee56d99b3090d27d6c07e954c2bcce618192532b1fe829e457160010a115be2f4deced7db96ab99adadefb5143f39aee4780854d11e4c6e77acf3c4a1d15e8df4f7cf4b7da3c96369101b364556922c2e64ca165849a9a467ee1e6f006ae18205a226599d6fa31ff972071d55b29693a858f3a4d5795256583ba934011fa46a8fc88f94c5ba0492218d9964e24d208d966831c8887a8336c43d8e6674bf7a368b37bc408c30a072e27a7fc0628ed78af125fe8fd1ce6aebb4a260795d394088df5f145dc76e84cd0920c1aad6399a4446e77a63cabd18625c6373d67140aab03607f10909bbd65dc07241ac74746600f6c47e463b16022d5e32d6f4b8a04d8105e475d2c106a07719d252cac44e8cf6b3b062ebf27ffd49a406dfae6e56c653cac937c18ce2b5fbcfd4e84b8c4d2bc6670b86074b36dff838488bc47a2698a209d187c08507dcf5c386ff782153608cc2d3a3631a7a35953ee6d27419f841974d5b3991f908c23c2e2a33e7ff5c85d930c9a7a35b5ae64a702b905cf906d97569d2cca3597588bd30152716cc091863ff019f5fcc576f4b51d62882a950e50c689598c1def00b6487fb47efc5f63f2eee042706c258cd6f5e08dc0d50ab58d4ba22d67f538d0223ebc282709d9a92440caceb346347d3549e4218d414957fc97b4ee41d45843bd4cbcf5644471fd050f7759ed6d593bfd9aae0b49226607bc7fa611f15b1388e290dc6b34dbe72c47cd9288f50b46cb9e98e4f92dfb0204ad53f63d2cd9a39e36d1249f70f547b6b777f1d0bc7358d94ba349a0c0b70714551876c6e4b15f91cbac82abd1788b793b31a19b48498e070fc0b7b1ed559a29002d1b19c092ea4152f69271da27e9c7d16a4e7d52a757d7b40f1f98df75c2a224f8513315329afc47981d672d3aee3561b3b10ab1a6ee0a8c4ef9231371df24dd67d6ffc7f23e99e72c34dcc0af20d88fb26879f1ec2ff936cd58ba9cad0735932a7d75ba626409dda435e9beea39d15f6782609972baec2f6cbba8a3d9651486e3ae5aea6c913f782c950589c1001a6112fe28bbc0044f02a5503d3b8824c0c87a41e7816b35f691aebbb5bdeeff14abcab8d8d2a8a2ddafd272bbb900c29f1fdebce32984dee57677d4ab3af50628463f1f7866fdac88fe657f80e7410fc3809f1085340b98163c3afde15224d7b15320a4f0883c555148ac63c1822d18fe4ece18d02af6443f19d11b1a9a142b8f17cc04e1b2194bd7f75e36e01805dded7183dbfdfa21a39c9284133d7109c3f091d394e0ef4bc4bb4624349901f88925c7f68541cc4a2f7c5bbbb5efff4d587e2e86a41f64100c0470b352d2ad4cab5406c6303988f642db6e4cf5266837a06a5097ff44fc44ec6dcfd1354fca4bf3ab3addfd07d8da5b724ab863cae8f3cb39e4e04c40ec4920184ff7d622041238570b30fa88aa19dada9da096922d8b7646ee86be802ae2f975359bf17602f159824579dd2700a396a433dce6ca9c1b802e14a8e8a234fec7890672b18c996d5a15dcc01b9992ba2521e9d3b837bfadc3128cd2ecbd43c15a2f95d5aced936b05df5aaef9281c5bce1cc34ef5daad6720fa60dfe91472a433b9416cbede4996ea2d9eb025ed14572045cac8409ac279cf435e0a54b90d05e24846ec640ea3fbf0aab439c71aa9137939f7b96f34c7c87973adccd95764181660cf270a04e21c05959818d19ee79cfde03f42544f8169845e344a1efe23c9e1f2ba2dc194a487f8bbc7ecae3ec8cc397fd777a1eedd0e78b5bcf46d8e0b052f62d9311846aa50d46b3bf421bc33293f0e8bafe4c6a16c80c5083b1b30412fc9b20317355691f4816ea021549e11915465b23302683373c078c4ee239a27e1ebf6deed26f5d962cc9f63022f4d41cddd2d1de5287d28c418b6106db17461632dacadff81077b13d8171a6f3e625222bffe0d20c347cabac1885e879672451c4109c69e40b83f7a8bf4021aeb7e8ee53c3041f3a6202dbaa3e932c93d2a56ef6e57ec3ddc44bdab1d1c3eb47b2933b1ffc9a1de84e5c4474a7a31393d64d6cad43e33d4b239cce4e452eab5a74a193621a690805659ed154ea25a30d74f67553a0b8c67af855ca8c138b75dfcf0b63ffc40e8f12999a89d0115030167b06dde5e8d5eb3a821816f5b78ed93953f46de96e6ac721d842d1f83ef8192b2741d4fbc7d9b2185fe7213f61cdc555ca805272b1603fe0b7dae1bdb25f843cf59415ec941af9a5fc12aec293abfafd511cb0b84b43a85c31a0f40c295c817f7b1d5717aa1a6765a5cc8ce15d01c7b1d739af00ed72a7ce3807e6036a97c11ae37f4da7fd170d004991852ad4bc2c29645eac8c7edf6a0de453d8975a863d576cf3d8f2d06de725ed1e9bbcc52500349239908a37cfe56bc3f7544e03c9bbd36966976718cf29fe6c7fef8a78de3b3468ffdf53dd28605cc7e7f9b54b076394571eced4a8a6fdd199604eeb47c3ced692d5528dc6337f1c37db187f55bb63abca3234c1d0863fb57603c016d332f99155671b475644e1903da427d5d19b6dc1529a00c866581701f45a56d96a34dcfc8c943d3e32f8c50385a8dfabafab94219c8bc25c297fd07cd2d1a5ec00865210923ba18dd438611ff9ad0ab26087d66223289113ce42bf6ede3bed0e004345d711c32f5d5510825472738d28e6471fae08242779d055e90883c206915f4968f342784f1626dddc02f75f0b75a4aec9647d9813f2f724ae00006b79fc9263bcad088de075053815fc404d9fa99180fca669c9869928b4ccb91d07ee277de5a3dbfcc14ade680c928975d49d0fd6380bee04b7212fbf90ca174d0117c64990dce7956242d7a93b179404600e5d57cf5271ebe2f28c8cac930ddd10224112ce32a625590527b698c0ec43e9ddced43f2a489cf310354989b5e522b9820ab42729f5c96990a62603637cca8957cd3a1b0dc80329812c6a2c6aa747348cc03577d9164adffd18d4d5dce6cd3ebfb30c53a1eb0a9e55f9ab9c184506ad3a3b10af456f9c836793d5d3dca5f1cee4e4ea4dfaa3f245dcf97a7a2814ea84b6d3adb53a9057c39ca63178973987a3b4ea2c3e7b49c1676b879ce1a353df07fae1d119700300ae3b51266bf74e0bc0a9e9d08d87361daea33d6b09b94463bb8953e7752f92a6b6562831ff29589a3c4ac102555b27e939c4c92b6686f5f84d07d9d91f5c661b7b523e92319f127a7ec5085ac1bf75b48c97aa6fdf4164afe2eddde0b2d518dc384831b2b9604cd207c4490977805bc4bd650a35f17da34c408414d6b52d74b75d3461fe0b2d9955a7430d455852a12edc87c04aa38ef8603fe33517bbad843816082c4f8775ca046cb2aa3b2d4acc95287d1fee173dd47fa3e42b9042a7e08baaaa9df730d9dc23e79c2a80c107689a144550cd9cdfa89bd9cd9ba76593228782350db7ee57c4399629fb825e0ebd298deb43ebd0c559c078d3baba0ac861a9f0c9ef61d4ec1b213ba32f0747456627000c586458ac1639356e0401ed0064fd2e22e900c367e2390cdc1b651cdf591f8561b9ae78c1f496eaafcc21df0921c53fd3a8852fb16940f5aa40daad28243669927512d3f844a30e7d6329a1501d052e0fed38aa04bdd35b93f50656732c1397ff45c4b04387455941a5d5d8f9981f611defc553416cf4c7cd2ef707ece89eec1db82b2c1d80b89e8bb58939393614f3feb183a377c223475e506bc3a6f310e3f810e3a9cb6e5d938e0a5c779b1835d769375f77dce019c11432a7da4224edff523d01cfa387d85285308cdd96850fb3df1c836d468b6634efd408949e2eb42268ba656e7735079ab0a77393c722ddf65630c17f51596f272b48ee7c6e9b363bb0302644bd23937fb0f3e7a60d92e6411f4c7d6223cdc6695882ff1b397818ca9a8a0533f6fcf17901449851f1c7badce69b0ed902ce84d56786d0cc4ad2074f7fa13883fbba8738286740d026cbc5cba890ac3f9b74a449535721a9d2c85df78f086c0f9283a1cfdcf6a71823d4d95f9d79b22cb8ebc70b3b267417d06c657125d6b7dfe510e6636648c9c86ccdc442fc686387df43db6abb057dfc00b299267e53db4b5ec71a8af0c8c39739e31af49fe203a9a5b97ccf65e3bd75fe78731ea991e46ef954f4f458a6f2a773c34a5ea418429f1ffb407f9673585ec2214e8cc61a86c97113c5afc609968725a839a0e88f12d846b6650917c586dd1dad0755ea4ec4568fc4ea28d4a4e0f741c7ed7363f107f9b5542c47d9872cddbd905fe90c08780fb32dd69e737cc2df3f9d67100e2b338b9e8b181ea220982f53a3c53b873c9f901ebbc8958c5111437174057f53f6e6158e5352cc03f2fe2b9152c30400e1c393258d4b6600f0bb8b195c0fdaf6d5d8bf660438704a23eb874199ccb288a70d6ea149421c1af78723c461107de29994df7c16c1f686c369d23b625732093c3ba78083e2cdd0663ebb6cf82f4119362d99a91205d285696e0e1a57a0789086b880ad0747580e0f6482e35d57d8cf6a52ad16c0db1af453c61950657755456bec140021ae606de37fa56b8a9187ebf1090b7ca58328e9db6c8469fa406665dc111567323961e649a5beadab60f65808abbeea16786f724d557f1b01e943ff5d9f1bc96b36fae38ad200890bee8ea20ccd2876e6c8f35112cd504056f4a0c89018e02007e996b2b6b9be7e13144c37f8b2dd24a79f88e2ebd9469c4a8347bea859b8c05a83a2432bf1e39242b4301016fca0d3e7d9b688f86abaf60a1cbb130aea6d66dc13eee144dbd3b3ca09157ec9114bd578e0f3e86132781b7c4a26ed4e2722880a83ddba8395c6acde3aec4e44bb7c7c13bb6dda6d539be32c855de5845bc65d29ad06412b6ebc07d1f92729de9dc01ded51da551a2a5917044e3c8ddeb504ca42bf085ff6a528854ca0ab24dddbe4edec1966c98dfc9821fceb781069bdf766af88c6404e66b1371d4ceb9e81f31e0a17149a9184de609415b1e64345fbc38675852bec529fce5ac431f8af2e3ca91f1c502a21a9e7fbce65b6fd91eefe57cc78f1c14fc92e5ad7866f0b7cfb05cd982183a93b7e7964d1011b5caeecded531a0c77bdeaf8d6ab3b8e17cbbe2bca16c6d1542b193af732b3cc15fb368f47282adbb5d27e7675ac63b99dc2ca891904f7ae75f9d327cf41fa51ee6d9de111e0e4241c1c9b58a8d41aadfc1a15540b33b1f84a2bf9405966d1cfa019366f652d7dc073f9bd34311d016159cb7e83bf5d27533e68859c039cb330452dede0a8bf0814beaaccc3b5c672c39391b3e6df2882e88f4b2c207b948c7e0cea9f2ec9e244d3cf144d9d9a2846250c452336dda648e692763332857db9044fa000f812ebb226ad479530141f168cf0ea291b2571e86c553f1c37c5b340f0cfb7f4e61f5fe6237ecdef096bc661f00ae1b289e9f26d384b2c6948392a8759619cc6faad238784ac2b514b00e8e6fdc3147d4a0897a074b71621340db08a9931933983c70e68b4e2715645c82d0bfd03dae8c1226c0e6eb037421ad6e78f6c9806862e5812343817216e32fe844982674faae0b15c50b5815a6b1f46befae1296ca4781c59fd7a5d7d5848386a9b3a93b8889e865365a3fe6dfbb3491bd0cc5e9530e309e1953242fd70d61c1b3b16f0717ac23144daf8860f012a323e459d27f81d4a4459128ddf1dbf1fc5e9285340d15db52c290f43d3a8edc3433b839f09cb98abdccdbe00d0b3c77422e45aa80d38dc478718806ba9cc65ffe57a766df32c7628c74b40f7db4230a0f87c357177c4aefde175bdc4fbeaeb81c8317820ba66803a0704deed31279ae70dd5a1a9d370db9df3f161a4ddc3a0903bd00413724c2b9cb53d0b7ceaaee2f7eec7f4862b4e64c7b9ba9021b107fbd514a2127ad8ae131a1a0a62801104983452df72cd597fc788e37fdbdfc8d3518bb05049cf548510479e7bff87462956397f7143bed6353476added716eb5cfe2c3778745008b2d2822a516143a8d5b5c51b3294938ea75c516acdfa83a36660fb75d6f49e02a92533a6dccaa7f68da3ff3a03fd7209e92c44dc88bb227133ed1853976dc94f8c6c9cadfc311676721acbd89db437eb5eb279fe700945d86482f3e17d557cd85a7c34f5e550805c28e58e9c026cd10f64e968c089a53c9d24c3ba4e6b1fae72d6e742fc68a2c3c8558380e9dd3419eb8eb3a9fb2509ff813f62cb05dda8ed2ac97a1d1242047c8ec0888e734195d00bf5d16d8b3726abd951ebb70d9beeb6d2ef10504e12f8cd3cdc9a01acc1aa96baf1850761a536bc3df2117023bf6a192b567281b78687db97acc34771c432c5c2242f5b252774fb9e292d8e3f3d3163b59475b1d66ee66c0fe7a00d848ef3152947831cb2e11449afd4fa4ae67f1c1d6f062bcd6c9397f5848f55b44b51b2f1330351bfdb46dff1ee9c5e47c3d7f7b49d0d6cb7c8ea2471593710bde150f0e10e18f3d957eb5d968db92a586c4a2c9a918cdbc8746be40022daa18de02856801a95c5b1756f4acc3c8781d53e199767f8cded23f58dfeeaf929d8bfe52728d5b68b87daeb2d42e25507bbac29e7f4e38fabf25f6425d59b473a2ec27c3b8f6590d8697b5871a6b8ced576f9ece142c9ce96a41919ee4de71db17a807daaa2d88caad7eb3bbdaaef97f2f3a630a7eccbd06b3c0e73c664a36f8c8d79404cda9f1369fb823b3b79cbad2ad1df51acc1bf5ec7b85010abf4c0b0f576815a3c161a46c97cfab133d2e4e0fe41054e15bebed1fb060970e75be8addf5297cb8a2b71802105468d6b6e29f394370dd9290c2165e3332ff697ea67c5c251a0141715625f6a6c909d7f79d1682661b494201237adaca877821c7019bad2d08f63cd6ff768efdd2e59e48852f5e7b8af847582267426b4f837d1d75fc1cbbb6e8739dcad0ff93052b2ac33a897b0dce1f427dca2b6d236b0dff87bf415c748d44e83ea40c421149f648a3d14d12022dce37015da30bf9313fc196c142b39398acb31df22700fcc9f6c3db2922aabf9a5ec504882cb72ca43e497a74457df5bc82fd5df9e15e580e834055eccf6842df6aba655bb9dff0539153213d7277459fe17a960cc5991006bbfd2109988438b38a2a927f31df9bbc3429437b2babb2a296f24fcdd973d6d064714512153bbe86ae7d320c89d4bc7defe67c98008a4916e1f7d8ae1f4c4e268dd7ebbb0d15221d1e13dbbcdabf1a41b1f73fc1638b9f5739c379f889b2ff5782e6f61479e8562ef589c5166dd705f9de23c9f6b51563680fcd62956ba31e5ddff8e80ecc80d32d8199cfecad4838afa2b333a7d8ffd5d678d2cc3a7d2be52e8cad57037ed0fc5eeaf042b88a5fbf24609094c52394604a391c59e174089628d59b897e9cead52143f19820869823430921dc53591f82d94f488b350e66b5e5afafeba95c2e58961bc8face3e803a61e44014e7147eda7b9991ccc2121fec03f2bc4928a4ec366e43dcd0f07db9add58b5f770285a36df9003d33884e0b9c307e963d5b69d196c0b356875766cef00e36273f27644ca114b8047be248ae6f05cdfce9867451aa0a3b6936f904a975098c88e0b54406c0869ce1c56fc60c00c749a95c2dabf842f6465b0d782a08a7eaac7f19908eb266604eefd7f3a08c031967fd88b3b934d77fcdc438485e251db70e260928269a8562c8951e147650ffd52afab74bc301a5b7685c94885f5e6f8504cc8c7d328a47e5a761ca32140a3ddbf7fefd330bc52056cf53a51915fd15ca67b11164f991e7a116ac27e161251c5d773e0b3f0250624aab9263f83efac0d578387b002eaa500b1c849a8406cacde1af4672933d93302299b6ae2ef611bf9da8e485c97a17594a8d0122b195cd8266d40cb4d16071128d737f65b50f4be0a696420a898c3a1975abe6a415b4902c96d7ea34b3e6924c28631aad157f9ee44c8b0a14f076ea1cc737352e6b5f2640ab9ebc917a47782b38d38e1834b0eb0df189720c64b1343ce33accfd59775b542fbc69ef3910d84a53836e1e8d62784ab061ee356476a70e1d1cca5e0939ac4a60886f2f71cea253d05d4493c9a75e198590df3d056488d5e592c9b321cc8935cef726f31d2b2bc39e02be4c6de2e56c9707a9efb4fee55d4f05999fb6474f0a0205185db6f3da1909b5ef6b7e4f2f59b4288788dd318e36013dcebb2ca42c2771cf5bd011c8a34661e05e631c8a56c2ed979f39217fd9d0395700bf50a96042eb3710267b188750057a9b45a9c7624ef3e542e81df751ca411acf87029c0a5b6a6024c29fe1a47322291e4db82f291a1ff08b5d16f93d100e18afe3bfe500c672b23e7cf1f4a1c7e0e7732f95c85647e65866f4dd37599df3227d11822e30c79c7ffc664610505774804115d15cb3fe9e27576ba46571060bf292caf63c387459540b8dface42c943cc4f9d716ce1769f6bea3147bb99b3b06f4917f28bae0d4cc28fcc5474922b348a28921a2ea79c3bd54869f7650adb4dba857c125b6c60815d60a0351041cdef7459a1c93af22e238771e2d31a1ee14b02358a5864ebef99be9d82facf5695ec296a100a96e24e604455ab2901a06e83cde1b1d912d627ce279857a39827896727c3032a4b159fd1719143ae480e9d4081981c64770e95ce35aae39d0100c13cfc360365de467570e50e7afbadd7f5d94798cab86188cbe3ae1a0fb0e677fe6c964b135a61d4457a4cc2264d7e6a625f626098839613301255f82d5ad7349cc45727162cec20776085bf76e164506cce9787efcec43b818b3264426a326611cd2dc109cb256c06dbbfd0491f0cfe5fa229e895f5478b44a998bf636dc6ce984ef176ca8ed07267e7006b0bc8b4cb5f05a47195027eddc029fad78aa2a8e2df627eb24f8ec506fe5cc2678879411f8ce1301b860608a50262cc2a537282e201f31714314cdd20409e0350ff9cac72bf39f9f45538794d73e0fdbeab22b661fa8696eced86c4b1f893098c823e714afcf451d167a73605c3107a1607e4c4b380b1ed350f71020289df0fedf0c90a8995fc0f7077247e5e58b5007b3c7dd9ec2a880e6676f33bf95881602168c0612215c98676746e6a1389f2c8dd8e8aeb31204809ec81296f77c36049b8470b41363f88cc287b70b6792fdd19a86c09a43c2261a9489320eff938396fa8dafe9cecfb0f77137b0a061176fdefef6b29f42078a1889b79b0a11fe5fc34f1f2ecddbf22b8e41e94816f288427abcd6358271caa1b8710fc2ad070573a5d114dedba096f2b91c6f970369dafe3a6aa5e9a9f8e4d5581b3e0b7f223d0e12b624b0acaa57da36695c6136c6a071377f54c83a0ef01cb47ca428679957c8ee7bdb26daa6ffc85fab27632efdd403405583421971045dda8aa1e4332cc6979b19bd271776e36497970b8df10d1afc77b1061062b07a97624d6cf52220a96a1014a56df5e9632d2b587e135073156d71b3362c4d5392189743d6260e40f18031255bf20d598b3e8c8acc72304bd67a273517df663b923b760b394448a3e4ddb0109addf8ad4b3f3c99bee319dc0fcf05c9daef3a92da381</script>
  <div class="hbe hbe-content">
    <div class="hbe hbe-input hbe-input-default">
      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">
      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">
        <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span>
      </label>
    </div>
  </div>
</div>
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">
    </div>

    
    
    

      <footer class="post-footer">
          <div class="post-tags">
              <a href="/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" rel="tag"># 设计模式</a>
          </div>

        


        
    <div class="post-nav">
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/08.%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/" rel="prev" title="08.单例模式">
      <i class="fa fa-chevron-left"></i> 08.单例模式
    </a></div>
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/18.%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F/" rel="next" title="18.享元模式">
      18.享元模式 <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">zhengyidi</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">39</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/categories/">
          
        <span class="site-state-item-count">5</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/tags/">
          
        <span class="site-state-item-count">7</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author motion-element">
      <span class="links-of-author-item">
        <a href="https://github.com/zhengyidi" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;zhengyidi" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i>GitHub</a>
      </span>
      <span class="links-of-author-item">
        <a href="mailto:zhengyidi1357@gmail.com" title="Contact Me → mailto:zhengyidi1357@gmail.com" rel="noopener" target="_blank"><i class="fa fa-fw fa-envelope"></i>Contact Me</a>
      </span>
  </div>



      </div>
        <div class="back-to-top motion-element">
          <i class="fa fa-arrow-up"></i>
          <span>0%</span>
        </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">zhengyidi</span>
</div>

        








      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="//cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script>
  <script src="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/pisces.js"></script>


<script src="/js/next-boot.js"></script>




  




  
<script src="/js/local-search.js"></script>













  

  

</body>
</html>
<!-- 页面点击小红心 -->
<!-- <script type="text/javascript" src="/js/love.js"></script> -->
<!-- 鼠标悬浮 -->
<script type="text/javascript" src="/js/mouse-float.js"></script>

<!-- 鼠标点击爆炸效果 -->
<canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas> 
<script type="text/javascript" src="/js/fireworks/anime.min.js"></script> 
<script type="text/javascript" src="/js/fireworks/fireworks.js"></script>
